/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package rna;

import java.util.ArrayList;
import java.util.Random;

/**
 *
 * @author igo
 */

 /**
  *@Descrição
  * No neuronio foram considerados como atributos: a saida, o array de pesos, o
  * resultado do somatório e a referência a qual camada o neuronio pertence.
  * Logo, Quando um neuronio for criado, é necessário: informar a que camada o mesmo
  * esta vinculado; e chamar o metodo para definir os pesos iniciais.
  *
  * No neuronio é também definido os seus pesos, que serão os pesos das conexões
  * que o mesmo estiver envolvido. Com isso, no neuronio possui os metodos de ajustar peso
  * assim como de definir os pesos iniciais.
  *
  * No neuronio também é calculada a saida, através dos pesos definidos e das entradas
  * acessadas da camada a qual o neuronio esta vinculado.
  *
  */
public class Neuronio {

        double saida;

        ArrayList<Double> pesos = new ArrayList<Double>();
        //ArrayList<Conexao> conexoes = new ArrayList<Conexao>();
        //ArrayList<Double> entradas = new ArrayList<Double>();
        double somatorio;
        Camadas camada;
        double gradienteLocal;
        double Entradabias;
        double pesoBias;

        public Neuronio (){
            Entradabias = -1;
            pesoBias = 0.5* Math.random();
            gradienteLocal = 0;
        }

        public double getPesoBias() {
        return pesoBias;
        }

        public void setPesoBias(double pesoBias) {
        this.pesoBias = pesoBias;
        }

        public void setCamada(Camadas referencia){
            camada = referencia;
        }

        public void setPesosInicial(){
            for(int i =0;i<camada.entrada.length;i++){
                double valor = Math.random()/2;
                pesos.add(valor);
            }
        }

        public ArrayList<Double> getPesos(){
             return pesos;
         }

        public double calcularSomatorio(){
            double resultado = 0.0;
            double soma=0.0;
            for(int i=0; i<camada.entrada.length;i++){
                double produto = camada.entrada[i] * pesos.get(i);
                soma = soma + produto;
            }
            resultado = soma + (Entradabias * pesoBias);
            return resultado;
        }

        public double calcularSaida(){
            double resultado=0.0;
            somatorio = calcularSomatorio();
            Sigmoid ativacao = new Sigmoid();
            saida = ativacao.calcularSaida(somatorio);
            return saida;
        }

        public double getSaida() {
            return saida;
        }


        public void setGradienteLocal(double erro) {
            this.gradienteLocal = erro;
    }
        public double getgradienteLocal() {
            return gradienteLocal;
        }
}